home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Toolbox / Visual Basic Toolbox (P.I.E.)(1996).ISO / desktop / syscolor / syscolor.bas < prev    next >
BASIC Source File  |  1994-07-31  |  27KB  |  934 lines

  1. Option Explicit
  2.  
  3. '   //*************************************************//
  4. '   //*                                               *//
  5. '   //*                SYSCOLOR.BAS                   *//
  6. '   //*                [GB] 03/07/94                  *//
  7. '   //*                                               *//
  8. '   //*************************************************//
  9.  
  10. '   //This module contains functions for manipulating the windows
  11. '   //system colours.
  12. '   //Functions are labelled PRIVATE and PUBLIC //
  13. '   //You should only use the functions labelled +++ PUBLIC +++
  14.  
  15.  
  16. '   //******************* LIST OF PUBLIC FUNCTIONS ************************//
  17.  
  18. '   //** FUNCTION Hex2Long (HexString As String) As Long
  19.  
  20. '   //Example: ALongInt = Hex2Long("C0")
  21. '   //Purpose:
  22. '   //Converts a valid Hex$ into it's corresponding decimal value//
  23. '   //* Note - Do NOT use this for converting RGB Hex strings *//
  24.  
  25. '   //*********************************************************************//
  26.  
  27. '   //** SUB EnumerateSchemes()
  28.  
  29. '   //Example: EnumerateSchemes
  30. '   //Purpose:
  31. '   //Fills the Global Dynamic Array SCHEME(1 to i_LastScheme) with
  32. '   //the names of the User's Colour schemes in CONTROL.INI
  33. '   //Could be used to fill a Menu Array for the user to select from..
  34. '   //No Initialisation needed.
  35. Global Scheme() As String
  36. Global i_LastScheme As Integer
  37.  
  38. '   //*********************************************************************//
  39.  
  40. '   //** SUB WriteSysColoursToINI (SchemeString As String, INIPath As String)
  41.  
  42. '   //Example: WriteSysColoursToINI "Favorite", "C:\WINDOWS\COLOURS.INI"
  43. '   //Purpose:
  44. '   //Writes an entry in a private INI file that can be read by GetSysColoursFromINI
  45. '   //Note - INIPath is the FULL path, including the filename
  46. '   //Entries written to CONTROL.INI can be read by Windows 3.1 Control Panel
  47. '   //No Initialisation required.
  48.  
  49. '   //*********************************************************************//
  50.  
  51. '   //** SUB GetSysColoursFromINI (SchemeString As String, INIPath As String)
  52.  
  53. '   //Example: GetSysColoursFromINI "Favorite", "C:\WINDOWS\COLOURS.INI"
  54. '   //Purpose:
  55. '   //Sets the User's system colours from a saved set in a private INI file
  56. '   //Note - INIPath is the FULL path, including the filename
  57. '   //Use WriteSysColoursToINI to write a private entry, or specify
  58. '   //INIPath to be CONTROL.INI - both use the same format.
  59.  
  60. '   //*********************************************************************//
  61.  
  62. '   //** SUB SaveSysColours ()
  63.  
  64. '   //Example: SaveSysColours
  65. '   //Purpose:
  66. '   //This routine stores the User's System Colours//
  67. '   //Call it to take a snapshot (to be restored by RestoreSysColours) //
  68. '   //No Initialisation required.
  69.  
  70. '   //*********************************************************************//
  71.  
  72. '   //** SUB RestoreSysColours ()
  73.  
  74. '   //Example: RestoreSysColours
  75. '   //Purpose:
  76. '   //Restores system colours to that saved by SaveSysColours
  77. '   //No Initialisation required.
  78.  
  79. '   //*********************************************************************//
  80.  
  81. '   //** SUB  SetColourSchemeFromControlPanel (SchemeString As String)
  82.  
  83. '   //Example: SetColourSchemeFromControlPanel "Wing Tips"
  84. '   //Effect is not permanent//
  85. '   //SchemeString could be got from the dynamic array Scheme()
  86. '   //No Initialisation required.
  87.  
  88. '   //*********************************************************************//
  89.  
  90. '   //** SUB SetDefaultColourSchemeFromControlPanel ()
  91.  
  92. '   //Example: SetDefaultColourSchemeFromControlPanel
  93. '   //This is the scheme that the user has set as their default
  94. '   //Effect is not permanent. No initialisation needed//
  95. '   //No Initialisation required.
  96.  
  97. '   //*********************************************************************//
  98.  
  99.  
  100. '   //** SUB SetSysColour (Element As Integer, RGBValue As Long)
  101.  
  102. '   //Example1: SetSysColour COLOR_MENU, RGB(255,192,255)
  103. '   //Example2: SetSysColour COLOR_MENU, QBColor(2)
  104. '   //Example3: SetSysColour COLOR_BTNTEXT, 0
  105.  
  106. '   //Element is one of the COLOR_ constants below
  107. '   //RGBValue can be RGB(x,y,z) or QBColor(x) or x //
  108.  
  109. '   //Purpose:
  110. '   //Use to set one colour or more at a time
  111. '   //No Initialisation required.
  112.  
  113. '   //USE THESE NAMES IN SETSYSCOLOUR (CONST_NAME, RGB(R,G,B))
  114. Global Const COLOR_SCROLLBAR = 0
  115. Global Const COLOR_BACKGROUND = 1
  116. Global Const COLOR_ACTIVECAPTION = 2
  117. Global Const COLOR_INACTIVECAPTION = 3
  118. Global Const COLOR_MENU = 4
  119. Global Const COLOR_WINDOW = 5
  120. Global Const COLOR_WINDOWFRAME = 6
  121. Global Const COLOR_MENUTEXT = 7
  122. Global Const COLOR_WINDOWTEXT = 8
  123. Global Const COLOR_CAPTIONTEXT = 9
  124. Global Const COLOR_ACTIVEBORDER = 10
  125. Global Const COLOR_INACTIVEBORDER = 11
  126. Global Const COLOR_APPWORKSPACE = 12
  127. Global Const COLOR_HIGHLIGHT = 13
  128. Global Const COLOR_HIGHLIGHTTEXT = 14
  129. Global Const COLOR_BTNFACE = 15
  130. Global Const COLOR_BTNSHADOW = 16
  131. Global Const COLOR_GRAYTEXT = 17
  132. Global Const COLOR_BTNTEXT = 18
  133. Global Const COLOR_INACTIVECAPTIONTEXT = 19
  134. Global Const COLOR_BTNHILIGHT = 20
  135.  
  136. '   //*********************************************************************//
  137.  
  138.  
  139. '   //Internal Flags//
  140. Dim COLOURS_SAVED_OK As Integer
  141. Dim RGBARRAY_SET_OK As Integer
  142.  
  143. '   //DLL Functions//
  144. Declare Function GetSysColor Lib "User" (ByVal nIndex As Integer) As Long
  145. Declare Sub SetSysColors Lib "User" (ByVal nChanges As Integer, lpSysColor As Integer, lpColorValues As Long)
  146.  
  147. '   //** Note - ALIAS names should not conflict with normal declarations//
  148. Declare Function Beeper Lib "User" Alias "MessageBeep" (ByVal BeepType As Integer) As Integer
  149. Declare Function GetVer Lib "Kernel" Alias "GetVersion" () As Long
  150. Declare Function ReadFromINI Lib "Kernel" Alias "GetPrivateProfileString" (ByVal Topic As String, ByVal Keyname As String, ByVal DEFAULT As String, ByVal ReturnedString As String, ByVal maxsize As Integer, ByVal Filename As String) As Integer
  151. Declare Function WriteToINI Lib "Kernel" Alias "WritePrivateProfileString" (ByVal Topic As String, ByVal Keyname As String, ByVal NewString As String, ByVal Filename As String) As Integer
  152. Declare Function GetUsersWINDIR Lib "Kernel" Alias "GetWindowsDirectory" (ByVal ipbuffer As String, ByVal nSize As Integer) As Integer
  153.  
  154. '   //There are 21 System Colours in Windows 3.1//
  155. Dim ColourText(0 To 20) As String
  156. Dim IndexArray(0 To 20) As Integer
  157. Dim RGBArray(0 To 20) As Long
  158. Dim OldRGBArray(0 To 20) As Long
  159. Dim NumChanges As Integer
  160.  
  161. Dim WINDIR As String'   //Users Windows Directory//
  162.  
  163. Sub EnumerateSchemes ()
  164.  
  165. '   //Last edited 02/07/94 [GB] //
  166. '   //+++PUBLIC+++//
  167.  
  168. '   //Initialises Scheme(1 to ?) and i_LastScheme//
  169. '   //Scheme() is a dynamic array of CONTROL.INI Colour Scheme names//
  170. '   //i_LastScheme is the number of the last valid entry//
  171.  
  172. If IsWin31() = False Then
  173.     TellBadNews'    //Windows 3.1 only//
  174.     Exit Sub
  175. End If
  176.  
  177. Dim sz_Buf As Variant
  178. Dim sz_Topic As String
  179. Dim sz_Filename As String
  180. Dim fn As Integer'  //File Handle//
  181. Dim pos As Integer
  182.  
  183. fn = FreeFile
  184. sz_Topic = "[color schemes]"
  185. If WINDIR = "" Then WINDIR = GetWINDIR()
  186. sz_Filename = WINDIR
  187. If Right$(sz_Filename, 1) <> "\" Then sz_Filename = sz_Filename & "\"
  188. sz_Filename = sz_Filename & "CONTROL.INI"
  189.  
  190. '   //Find the [color schemes] topic
  191. Open sz_Filename For Input As #fn
  192. Do Until EOF(fn)
  193.     Input #fn, sz_Buf
  194.     If Len(sz_Buf) > 14 Then
  195.         If Left$(sz_Buf, 15) = sz_Topic Then Exit Do
  196.     End If
  197. Loop
  198.  
  199. '   //Enumerate the keynames//
  200. Do Until EOF(fn)
  201. Input #fn, sz_Buf
  202. If Len(sz_Buf) > 1 And Left$(sz_Buf, 1) = "[" Then Exit Do
  203. pos = InStr(1, sz_Buf, "=")
  204. If pos Then sz_Buf = Left$(sz_Buf, pos - 1)
  205. If pos Then
  206.     i_LastScheme = i_LastScheme + 1
  207.     ReDim Preserve Scheme(1 To i_LastScheme)
  208.     Scheme(i_LastScheme) = sz_Buf
  209. End If
  210. Loop
  211.  
  212. End Sub
  213.  
  214. Sub GetSysColoursFromINI (SchemeString As String, IniPath As String)
  215.  
  216. '   //Last edited 02/07/94 [GB] //
  217. '   //+++PUBLIC+++//
  218.  
  219. '   //Sets the System Colours from an INI File (CONTROL PANEL style) saved Scheme setting//
  220.  
  221. If SchemeString = "" Then Exit Sub'  //Failed Test//
  222. If IsWin31() = False Then
  223.     TellBadNews'    //Windows 3.1 only//
  224.     Exit Sub
  225. End If
  226.  
  227. '   //Test if RGBArray contains valid entries//
  228. If RGBARRAY_SET_OK = False Then Init_RGBArray'   //Also sets IndexArray//
  229.  
  230. '   //Do simple checks//
  231. On Error GoTo EH_GSCError
  232. If Dir$(IniPath) = "" Then Exit Sub'  //Failed Test//
  233. If SchemeString = "" Then Exit Sub'  //Failed Test//
  234.  
  235. '   //Set up vars for DLL call//
  236. Dim INIEntry As String
  237. Dim i_RetVal As Integer
  238. Dim sz_Bad As String
  239. sz_Bad = "unknown"
  240. Dim sz_Buf As String * 255
  241. Dim i_SizeOfBuf As Integer
  242. i_SizeOfBuf = 255
  243.  
  244. '   //Fetch the CSV string containing the 20 Hex numbers//
  245. i_RetVal = ReadFromINI("color schemes", SchemeString, sz_Bad, sz_Buf, i_SizeOfBuf, IniPath)
  246.  
  247. '   //Check result//
  248. If i_RetVal = 0 Then Exit Sub'  //Failed Test//
  249. INIEntry = Left$(sz_Buf, i_RetVal)
  250. If INIEntry = "unknown" Then Exit Sub'  //Failed Test//
  251.  
  252. '   //Check that there are 20 values (19 commas) in the string//
  253. Dim i_Count As Integer
  254. Dim AString As String
  255. Dim pos As Integer
  256. pos = 0
  257. AString = INIEntry
  258. For i_Count = 1 To 19
  259.     pos = InStr(AString, ",")
  260.     If pos = 0 Then Exit Sub'  //Failed Test//
  261.     AString = Mid$(AString, pos + 1)
  262. Next i_Count
  263.  
  264. '   //Fetch each value, and assign it to RGBArray//
  265. Dim HexString As String
  266. pos = 0
  267. AString = INIEntry
  268.  
  269. For i_Count = 0 To 19
  270.     pos = InStr(AString, ",")
  271.     HexString = Left$(AString, pos - 1)
  272.     AString = Mid$(AString, pos + 1)
  273.     RGBArray(i_Count) = Hex2RGB(HexString)
  274. Next i_Count
  275. '   //Fetch 20th Value//
  276. RGBArray(20) = Hex2RGB(AString)
  277.  
  278. '   //Re-order IndexArray to point to the CONTROL.INI order//
  279. ReMapIndexArray2ControlPanel
  280.  
  281. '   //Do the deed//
  282. NumChanges = 21'    //Change all the colours in 1 go//
  283. SetSysColors NumChanges, IndexArray(0), RGBArray(0)
  284.  
  285. '   //Come here if an error//
  286. EH_GSCError:
  287. '   //Reset to ordinal values//
  288. Init_IndexArray
  289.  
  290. End Sub
  291.  
  292. Function GetWINDIR () As String
  293.  
  294. '   //Last Edited 02/07/94 [GB] //
  295. '   //+++PRIVATE+++//
  296.  
  297. Dim sz_Buf As String * 255
  298. Dim i_RetVal As Integer
  299. Dim i_SizeOfBuf As Integer
  300. i_SizeOfBuf = 255
  301.  
  302. '   //Use alias in case GetWindowsDirectory has been declared already//
  303. i_RetVal = GetUsersWINDIR(sz_Buf, i_SizeOfBuf)
  304.  
  305. If i_RetVal = 0 Then '  //Failed Test//
  306.     MsgBox "Could not locate Windows Directory", 16, "GetWINDIR Fatal Error"
  307.     End
  308. End If
  309. GetWINDIR = Left$(sz_Buf, i_RetVal)
  310.  
  311. End Function
  312.  
  313. Function H2D (Char As String) As Integer
  314.  
  315. '   //Last Edited 02/07/94 [GB] //
  316. '   //+++PRIVATE+++//
  317.  
  318. '   //Converts a single Hex caracter into it's decimal equivalent//
  319.  
  320. Select Case Char
  321.     Case "0" To "9"
  322.         H2D = Val(Char)
  323.     Case "A" To "F"
  324.         H2D = Asc(Char) - 55
  325.     Case Else
  326.         Exit Function'  //Failed Test//
  327. End Select
  328.  
  329. End Function
  330.  
  331. Function Hex2Long (HexString As String) As Long
  332.  
  333. '   //Last Edited 02/07/94 [GB] //
  334. '   //+++PUBLIC+++//
  335.  
  336. '   //Converts a valid Hex$ into it's corresponding decimal value//
  337. '   //USES: IsHexDigit() //
  338. '   //** Do NOT use this for converting RGB Hex strings **//
  339.  
  340. Hex2Long = 0'   //Default Value//
  341.  
  342. If HexString = "" Then Exit Function'  //Failed Test//
  343. Dim LENH As Integer
  344. LENH = Len(HexString)
  345. If LENH > 8 Then Exit Function'  //Failed Test//
  346.  
  347. '   //Passed checks OK, so...//
  348. HexString = UCase$(HexString)
  349. Dim i_Count As Integer
  350. Dim l_Temp As Long
  351. Dim Char As String
  352. Dim Dec As Integer
  353.  
  354. '   //Hex number is converted in one step//
  355. '   //Count from the last char to the first//
  356. For i_Count = LENH To 1 Step -1
  357.     Char = Mid$(HexString, i_Count, 1)
  358.     If Not IsHexDigit(Char) Then Exit Function'  //Failed Test//
  359.     Select Case Char
  360.         Case "0" To "9"
  361.             Dec = Val(Char)
  362.         Case "A" To "F"
  363.             Dec = Asc(Char) - 55
  364.         Case Else
  365.             Exit Function'  //Failed Test//
  366.     End Select
  367.     l_Temp = l_Temp + (Dec * (16 ^ (LENH - i_Count)))
  368. Next i_Count
  369.  
  370. Hex2Long = l_Temp
  371.  
  372. End Function
  373.  
  374. Function Hex2RGB (HexString As String) As Long
  375.  
  376. '   //Last Edited 02/07/94 [GB] //
  377. '   //+++PRIVATE+++//
  378.  
  379. '   //Converts a valid [BBGGRR] Hex$ into it's corresponding decimal value//
  380. '   //Used to decipher the CONTROL.INI values//
  381. '   //USES: IsHexDigit() //
  382.  
  383. Hex2RGB = 0'   //Default Value//
  384.  
  385. If HexString = "" Then Exit Function'  //Failed Test//
  386. If HexString = "0" Then Exit Function'  //Failed Test//
  387.  
  388. Dim LENH As Integer
  389. LENH = Len(HexString)
  390. If LENH > 6 Then Exit Function'  //Failed Test//
  391.  
  392. '   //Passed checks OK, so...//
  393. HexString = UCase$(HexString)
  394. Dim i_Count As Integer
  395. Dim l_Temp As Long
  396. Dim Char As String
  397. Dim Dec As Integer
  398.  
  399. '   //Check that all are Valid Hex Digits//
  400. For i_Count = 1 To LENH
  401.     Char = Mid$(HexString, i_Count, 1)
  402.     If Not IsHexDigit(Char) Then Exit Function'  //Failed Test//
  403. Next i_Count
  404.  
  405. '   //Hex string could be 1,2,4,6 digits long//
  406. '   //1 digit (0) has been dealt with//
  407. '   //Order is BGR//
  408.  
  409. '   //Make it a RGB string//
  410. Dim AString As String * 6
  411. AString = "000000"
  412.  
  413. RSet AString = HexString
  414.  
  415. Dim iRED As Integer
  416. Dim iGREEN As Integer
  417. Dim iBLUE As Integer
  418.  
  419. '   //Microsoft store it as BBGGRR!//
  420. '   //Get Blue//
  421. iBLUE = 16 * H2D(Mid$(AString, 1, 1)) + H2D(Mid$(AString, 2, 1))
  422. '   //Get Green//
  423. iGREEN = 16 * H2D(Mid$(AString, 3, 1)) + H2D(Mid$(AString, 4, 1))
  424. '   //Get Red//
  425. iRED = 16 * H2D(Mid$(AString, 5, 1)) + H2D(Mid$(AString, 6, 1))
  426.  
  427. Hex2RGB = RGB(iRED, iGREEN, iBLUE)
  428.  
  429. End Function
  430.  
  431. Sub Init_ColourText ()
  432.  
  433. '   //Last edited 02/07/94 [GB] //
  434. '   //+++PRIVATE+++//
  435.  
  436. '   //These strings are used in the INI-File routines//
  437. '   //It is called by routines (Set/Write)Colours(To/From)INI //
  438.  
  439. ColourText(0) = "COLOR_BACKGROUND"
  440. ColourText(1) = "COLOR_APPWORKSPACE"
  441. ColourText(2) = "COLOR_WINDOW"
  442. ColourText(3) = "COLOR_WINDOWTEXT"
  443. ColourText(4) = "COLOR_MENU"
  444. ColourText(5) = "COLOR_MENUTEXT"
  445. ColourText(6) = "COLOR_ACTIVECAPTION"
  446. ColourText(7) = "COLOR_INACTIVECAPTION"
  447. ColourText(8) = "COLOR_CAPTIONTEXT"
  448. ColourText(9) = "COLOR_HIGHLIGHT"
  449. ColourText(10) = "COLOR_INACTIVECAPTIONTEXT"
  450. ColourText(11) = "COLOR_ACTIVEBORDER"
  451. ColourText(12) = "COLOR_INACTIVEBORDER"
  452. ColourText(13) = "COLOR_WINDOWFRAME"
  453. ColourText(14) = "COLOR_SCROLLBAR"
  454. ColourText(15) = "COLOR_BTNFACE"
  455. ColourText(16) = "COLOR_BTNSHADOW"
  456. ColourText(17) = "COLOR_HIGHLIGHTTEXT"
  457. ColourText(18) = "COLOR_BTNTEXT"
  458. ColourText(19) = "COLOR_BTNHILIGHT"
  459. ColourText(20) = "COLOR_GRAYTEXT"
  460.  
  461. End Sub
  462.  
  463. Sub Init_IndexArray ()
  464.  
  465. '   //Last edited 02/07/94 [GB] //
  466. '   //+++PRIVATE+++//
  467.  
  468. '   //This routine is called from other routines//
  469. '   //See - Sub ReMapIndexArrayToControlPanel() //
  470.  
  471. Dim i_Count As Integer
  472. For i_Count = 0 To 20
  473. '   //Initialise reference array//
  474.     IndexArray(i_Count) = i_Count
  475. Next i_Count
  476. End Sub
  477.  
  478. Sub Init_RGBArray ()
  479.  
  480. '   //Last edited 02/07/94 [GB] //
  481. '   //+++PRIVATE+++//
  482.  
  483. '   //This routine is called by other routines//
  484. '   //**Note the variable RGBARRAY_SET_OK //
  485.  
  486. '   //It sets RGBArray - essential before SetSysColour!//
  487. '   //It can also sets IndexArray - this is necessary for other routines//
  488.  
  489. If IndexArray(1) <> 1 Then Init_IndexArray
  490.  
  491. Dim i_Count As Integer
  492. For i_Count = 0 To 20
  493. '   //Get the User's System Colour values//
  494.     RGBArray(i_Count) = GetSysColor(i_Count)
  495. Next i_Count
  496.  
  497. RGBARRAY_SET_OK = True
  498.  
  499. End Sub
  500.  
  501. Function IsHexDigit (Char As String) As Integer
  502.  
  503. '   //Last edited 02/07/94 [GB] //
  504. '   //+++PRIVATE+++//
  505.  
  506. IsHexDigit = False'   //Assume guilt, look for innocence//
  507. If Char = "" Then Exit Function'  //Failed Test//
  508.  
  509. Dim Digits As String
  510. Digits = "0123456789ABCDEF"
  511. Char = UCase$(Left$(Char, 1))
  512.  
  513. If InStr(Digits, Char) <> 0 Then IsHexDigit = True
  514.  
  515. End Function
  516.  
  517. Function IsWin31 () As Integer
  518.  
  519. '   //Last Edited 02/07/94 [GB] //
  520. '   //+++PRIVATE+++//
  521.  
  522. '   //The SYSCOLOR functions all assume a 21-Colour scheme//
  523. '   //Windows 3.0 only has 19 colours//
  524.  
  525. IsWin31 = False
  526. '   //First, a quick & Dirty test for Windows V3.1//
  527. If GetVer() = 101976579 Then
  528.     IsWin31 = True
  529.     Exit Function
  530. End If
  531.  
  532. '   //Now check properly...//
  533. Dim check As Long
  534. Dim major As String
  535. Dim minor As String
  536. Dim winver As String
  537. Dim M As String
  538. '   {Check that the user is running Windows V3.1 or above}
  539. check& = GetVer()
  540. major$ = Format$(check& And &HFF)
  541. minor$ = Format$((check& And &HF00) / 256)
  542. winver$ = major$ + "." + minor$
  543.  
  544. If Val(winver$) >= 3.1 Then IsWin31 = True
  545.  
  546.  
  547. End Function
  548.  
  549. Sub ReMapIndexArray2ControlPanel ()
  550.  
  551. '   //Last edited 02/07/94 [GB] //
  552. '   //+++PRIVATE+++//
  553.  
  554. '   //INPUT: IndexArray in Value order//
  555. '   //ie IndexArray(0)=0
  556. '   //   IndexArray(1)=1
  557.  
  558. '   //OUTPUT: IndexArray according to CONTROL.INI//
  559. '   //ie IndexArray(0)=1
  560. '   //IndexArray(1)=12
  561.  
  562. If IsWin31() = False Then
  563.     TellBadNews'    //Windows 3.1 only//
  564.     Exit Sub
  565. End If
  566.  
  567. '   //This is the order the CONTROL.INI entries are stored in//
  568. IndexArray(0) = COLOR_BACKGROUND
  569. IndexArray(1) = COLOR_APPWORKSPACE
  570. IndexArray(2) = COLOR_WINDOW
  571. IndexArray(3) = COLOR_WINDOWTEXT
  572. IndexArray(4) = COLOR_MENU
  573. IndexArray(5) = COLOR_MENUTEXT
  574. IndexArray(6) = COLOR_ACTIVECAPTION
  575. IndexArray(7) = COLOR_INACTIVECAPTION
  576. IndexArray(8) = COLOR_CAPTIONTEXT
  577. IndexArray(9) = COLOR_ACTIVEBORDER
  578. IndexArray(10) = COLOR_INACTIVEBORDER
  579. IndexArray(11) = COLOR_WINDOWFRAME
  580. IndexArray(12) = COLOR_SCROLLBAR
  581. IndexArray(13) = COLOR_BTNFACE
  582. IndexArray(14) = COLOR_BTNSHADOW
  583. IndexArray(15) = COLOR_BTNTEXT
  584. IndexArray(16) = COLOR_GRAYTEXT
  585. IndexArray(17) = COLOR_HIGHLIGHT
  586. IndexArray(18) = COLOR_HIGHLIGHTTEXT
  587. IndexArray(19) = COLOR_INACTIVECAPTIONTEXT
  588. IndexArray(20) = COLOR_BTNHILIGHT
  589.  
  590. End Sub
  591.  
  592. Sub RestoreSysColours ()
  593.  
  594. '   //Last edited 02/07/94 [GB] //
  595. '   //+++PUBLIC+++//
  596.  
  597. '   //Restores system colours to that saved by SaveSysColours
  598.  
  599. If IsWin31() = False Then
  600.     TellBadNews'    //Windows 3.1 only//
  601.     Exit Sub
  602. End If
  603.  
  604. '   //Test if OldRGBArray is valid//
  605. If COLOURS_SAVED_OK = False Then SaveSysColours
  606. '    //Sets OldRGBArray and IndexArray//
  607.  
  608.  
  609. Dim i_Count As Integer
  610. '   //Pump values into the array//
  611. For i_Count = 0 To 20
  612. '   //Change the appropriate element in the array//
  613.     RGBArray(i_Count) = OldRGBArray(i_Count)
  614. Next i_Count
  615.  
  616. '   //Do the deed//
  617. NumChanges = 21'    //Change all the colours in 1 go//
  618. SetSysColors NumChanges, IndexArray(0), RGBArray(0)
  619.  
  620. End Sub
  621.  
  622. Sub SaveSysColours ()
  623.  
  624. '   //Last edited 02/07/94 [GB] //
  625. '   //+++PUBLIC+++//
  626.  
  627. '   //This routine stores the User's System Colours//
  628. '   //Call it to take a snapshot (to be restored by RestoreSysColours) //
  629.  
  630. '   //**Sets RGBArray and OldRGBArray//
  631. '   //**Note the Variables COLOURS_SAVED_OK and RGBARRAY_SET_OK //
  632.  
  633. If IsWin31() = False Then
  634.     TellBadNews'    //Windows 3.1 only//
  635.     Exit Sub
  636. End If
  637.  
  638. If IndexArray(1) <> 1 Then Init_IndexArray
  639.  
  640. Dim i_Count As Integer
  641. For i_Count = 0 To 20
  642. '   //Get a User's System Colour value//
  643.     OldRGBArray(i_Count) = GetSysColor(i_Count)
  644.     
  645. '   //Copy to the working set//
  646.     RGBArray(i_Count) = OldRGBArray(i_Count)
  647. Next i_Count
  648.  
  649. COLOURS_SAVED_OK = True
  650. RGBARRAY_SET_OK = True
  651. End Sub
  652.  
  653. Sub SetColourSchemeFromControlPanel (SchemeString As String)
  654.  
  655. '   //Last edited 02/07/94 [GB] //
  656. '   //+++PUBLIC+++//
  657.  
  658. '   //Sets the System Colours from a CONTROL PANEL saved Scheme setting//
  659. If IsWin31() = False Then
  660.     TellBadNews'    //Windows 3.1 only//
  661.     Exit Sub
  662. End If
  663.  
  664. If SchemeString = "" Then Exit Sub'  //Failed Test//
  665.  
  666. '   //Test if RGBArray contains valid entries//
  667. If RGBARRAY_SET_OK = False Then Init_RGBArray'   //Also sets IndexArray//
  668.  
  669. Dim IniPath As String
  670. Dim USERWINDIR As String
  671.  
  672. '   //Get INI path//
  673. USERWINDIR = GetWINDIR()
  674. If Right$(USERWINDIR, 1) <> "\" Then USERWINDIR = USERWINDIR & "\"
  675. IniPath = USERWINDIR & "CONTROL.INI"
  676.  
  677. On Error GoTo EH_SCSCP
  678. If Dir$(IniPath) = "" Then Exit Sub'  //Failed Test//
  679.  
  680. '   //Set up vars for DLL call//
  681. Dim INIEntry As String
  682. Dim i_RetVal As Integer
  683. Dim sz_Bad As String
  684. sz_Bad = "unknown"
  685. Dim sz_Buf As String * 255
  686. Dim i_SizeOfBuf As Integer
  687. i_SizeOfBuf = 255
  688.  
  689. '   //Fetch the CSV string containing the 20 Hex numbers//
  690. i_RetVal = ReadFromINI("color schemes", SchemeString, sz_Bad, sz_Buf, i_SizeOfBuf, IniPath)
  691.  
  692. '   //Test for bad return value//
  693. If i_RetVal = 0 Then Exit Sub'  //Failed Test//
  694. INIEntry = Left$(sz_Buf, i_RetVal)
  695. If INIEntry = "unknown" Then Exit Sub'  //Failed Test//
  696.  
  697. '   //Check that there are 20 values (19 commas) in the string//
  698. Dim i_Count As Integer
  699. Dim AString As String
  700. Dim pos As Integer
  701. pos = 0
  702. AString = INIEntry
  703. For i_Count = 1 To 19
  704.     pos = InStr(AString, ",")
  705.     If pos = 0 Then Exit Sub'  //Failed Test//
  706.     AString = Mid$(AString, pos + 1)
  707. Next i_Count
  708.  
  709. '   //Fetch each value, and assign it to RGBArray//
  710. Dim HexString As String
  711. pos = 0
  712. AString = INIEntry
  713.  
  714. For i_Count = 0 To 19
  715.     pos = InStr(AString, ",")
  716.     HexString = Left$(AString, pos - 1)
  717.     AString = Mid$(AString, pos + 1)
  718.     RGBArray(i_Count) = Hex2RGB(HexString)
  719. Next i_Count
  720. '   //Fetch 20th Value//
  721. RGBArray(20) = Hex2RGB(AString)
  722.  
  723. '   //Re-order IndexArray to point to the CONTOL.INI order//
  724. ReMapIndexArray2ControlPanel
  725.  
  726. '   //Do the deed//
  727. NumChanges = 21'    //Change all the colours in 1 go//
  728. SetSysColors NumChanges, IndexArray(0), RGBArray(0)
  729.  
  730. '   //Come here on error//
  731. EH_SCSCP:
  732. '   //Reset to ordinal values//
  733. Init_IndexArray
  734.  
  735. End Sub
  736.  
  737. Sub SetDefaultColourSchemeFromControlPanel ()
  738.  
  739. '   //Last edited 02/07/94 [GB] //
  740. '   //+++PUBLIC+++//
  741.  
  742. '   //Sets the System Colours from CONTROL.INI setting//
  743. If IsWin31() = False Then
  744.     TellBadNews'    //Windows 3.1 only//
  745.     Exit Sub
  746. End If
  747.  
  748. '   //Test if RGBArray contains valid entries//
  749. If RGBARRAY_SET_OK = False Then Init_RGBArray'   //Also sets IndexArray//
  750.  
  751. '   //Get Users CONTROL.INI Path//
  752. Dim IniPath As String
  753. Dim USERWINDIR As String
  754. USERWINDIR = GetWINDIR()
  755. If Right$(USERWINDIR, 1) <> "\" Then USERWINDIR = USERWINDIR & "\"
  756. IniPath = USERWINDIR & "CONTROL.INI"
  757.  
  758. On Error GoTo EH_SDCSFCP
  759. If Dir$(IniPath) = "" Then Exit Sub'  //Failed Test//
  760.  
  761. '   //Setup DLL ReadFromINI call//
  762. Dim i_RetVal As Integer
  763. Dim sz_Bad As String
  764. sz_Bad = "unknown"
  765. Dim sz_Buf As String * 255
  766. Dim i_SizeOfBuf As Integer
  767. i_SizeOfBuf = 255
  768.  
  769.  
  770. '   //Fetch the current System Colour name//
  771. Dim DefaultKey As String
  772. i_RetVal = ReadFromINI("current", "color schemes", sz_Bad, sz_Buf, i_SizeOfBuf, IniPath)
  773.  
  774. '   //Test for valid return value//
  775. If i_RetVal = 0 Then Exit Sub'  //Failed Test//
  776. DefaultKey = Left$(sz_Buf, i_RetVal)
  777. If DefaultKey = "unknown" Then Exit Sub'  //Failed Test//
  778.  
  779. '   //Fetch the CSV string containing the 20 Hex numbers//
  780. i_RetVal = ReadFromINI("color schemes", DefaultKey, sz_Bad, sz_Buf, i_SizeOfBuf, IniPath)
  781. '   //Test for valid return value//
  782. If i_RetVal = 0 Then Exit Sub'  //Failed Test//
  783.  
  784. Dim INIEntry As String
  785. INIEntry = Left$(sz_Buf, i_RetVal)
  786. If INIEntry = "unknown" Then Exit Sub'  //Failed Test//
  787.  
  788. '   //Check that there are 20 values (19 commas) in the string//
  789. Dim i_Count As Integer
  790. Dim AString As String
  791. Dim pos As Integer
  792. pos = 0
  793. AString = INIEntry
  794. For i_Count = 1 To 19
  795.     pos = InStr(AString, ",")
  796.     If pos = 0 Then Exit Sub'   //Failed Test//
  797.     AString = Mid$(AString, pos + 1)
  798. Next i_Count
  799.  
  800. '   //Fetch each value, and assign it to RGBArray//
  801. '   //** Note - Hex2RGB decodes the BBGGRR hex$ used by MS //
  802. Dim HexString As String
  803. pos = 0
  804. AString = INIEntry
  805.  
  806. For i_Count = 0 To 19
  807.     pos = InStr(AString, ",")
  808.     HexString = Left$(AString, pos - 1)
  809.     AString = Mid$(AString, pos + 1)
  810.     RGBArray(i_Count) = Hex2RGB(HexString)
  811. Next i_Count
  812. '   //Fetch 20th Value//
  813. RGBArray(20) = Hex2RGB(AString)
  814.  
  815.  
  816. '   //Re-order IndexArray to point to the CONTROL.INI order//
  817. ReMapIndexArray2ControlPanel
  818.  
  819. '   //Do the deed//
  820. NumChanges = 21'    //Change all the colours in 1 go//
  821. SetSysColors NumChanges, IndexArray(0), RGBArray(0)
  822.  
  823. '   //Come here if there's an error//
  824. EH_SDCSFCP:
  825. '   //Reset to ordinal values//
  826. Init_IndexArray
  827.  
  828. End Sub
  829.  
  830. Sub SetSysColour (Element As Integer, RGBValue As Long)
  831.  
  832. '   //Last edited 02/07/94 [GB] //
  833. '   //+++PUBLIC+++//
  834.  
  835. '   //Element is one of the COLOR_ constants in the
  836. '   //Declarations() section of this module//
  837.  
  838. '   //RGBValue can be RGB(x,y,z) or OPTCOLOR(colour) or QBColor(x)//
  839.  
  840. '   //**Note -You may want to call SaveSysColours first so that you can use
  841. '   //the routine RestoreSysColours to return the User to normal, later//
  842.  
  843. If IsWin31() = False Then
  844.     TellBadNews'    //Windows 3.1 only//
  845.     Exit Sub
  846. End If
  847. '   //Test if RGBArray contains valid entries//
  848. If RGBARRAY_SET_OK = False Then Init_RGBArray'   //Also sets IndexArray//
  849.  
  850.  
  851. '   //Change the appropriate element in the array//
  852. RGBArray(Element) = RGBValue
  853.  
  854. NumChanges = 21'    //Change all the colours in 1 go//
  855. '   //Do the deed//
  856. SetSysColors NumChanges, IndexArray(0), RGBArray(0)
  857.  
  858. '   //NB The changed colour will persist in subsequent calls
  859. '   //to this routine until RestoreSysColours() is called//
  860. End Sub
  861.  
  862. Sub TellBadNews ()
  863.  
  864. '   //Last Edited 02/07/94 [GB] //
  865. '   //+++PRIVATE+++//
  866.  
  867. Dim msg As String
  868. Dim answer As Integer
  869.  
  870. answer = Beeper(16)'   //Issue an MCI Fatal Error sound//
  871. msg = "You appear to be running Microsoft" & Chr$(10)
  872. msg = msg & "Windows(tm) Version 3.0 or less. " & Chr$(10)
  873. msg = msg & Chr$(10)
  874. msg = msg & "SYSCOLOR functions are designed to support" & Chr$(10)
  875. msg = msg & " only the 21-colour scheme of Windows 3.1." & Chr$(10)
  876. msg = msg & Chr$(10)
  877. msg = msg & "Would you like to Exit back to Windows now?"
  878. answer = MsgBox(msg, 4096 + 48 + 4, "SYSCOLOR Fatal Error")
  879. If answer = 6 Then End
  880. End Sub
  881.  
  882. Sub WriteSysColoursToINI (SchemeString As String, IniPath As String)
  883.  
  884. '   //Last edited 02/07/94 [GB] //
  885. '   //+++PUBLIC+++//
  886.  
  887. '   //This routine stores the User's 20 Windows System colours in INIPathName//
  888. '   //Nothing needs to be initialised first//
  889.  
  890. '   //** The routine GetColoursFromINI will fetch the settings into the system//
  891.  
  892. '   //** Note - You may want to call SaveSysColours first so that you can use
  893. '   //the routine RestoreSysColours to return the User to normal, later//
  894.  
  895. If IsWin31() = False Then
  896.     TellBadNews'    //Windows 3.1 only//
  897.     Exit Sub
  898. End If
  899. '   //Obvious checks, first//
  900. If Dir$(IniPath) = "" Then Exit Sub
  901. If SchemeString = "" Then Exit Sub
  902.  
  903. Dim i_Count As Integer
  904. Dim RGBString As String
  905. Dim NumString As String
  906. Dim sz_BigString As String
  907.  
  908. '   //Save as per CONTROL.INI style//
  909. ReMapIndexArray2ControlPanel
  910.  
  911. For i_Count = 0 To 19
  912. '   //Get a User's System Colour value, and//
  913. '   //Encode it into a Decimal string//
  914.     RGBString = Hex$(GetSysColor(IndexArray(i_Count)))
  915.     sz_BigString = sz_BigString & RGBString & ","
  916. Next i_Count
  917. '   //Last value not followed by a comma//
  918. RGBString = Hex$(GetSysColor(IndexArray(20)))
  919. sz_BigString = sz_BigString & RGBString
  920.  
  921. Dim Topic As String
  922. Dim Keyname As String
  923. Dim i_RetVal As Integer
  924. Topic = "color schemes"
  925. Keyname = SchemeString
  926.  
  927. '   //Write the new setting//
  928. i_RetVal = WriteToINI(Topic, Keyname, sz_BigString, IniPath)
  929. '   //Re-Map for Save/Restore//
  930. Init_IndexArray
  931.  
  932. End Sub
  933.  
  934.